package main
import "fmt"

/**
【1】什么是断言?Go语言里面有一个语法，可以直接判断是否是该类型的变量: 
		value,bk =lelement.(T)
		这里value就是变量的值，ok是一个bool类型，element是interface变量，T是断言的类型。


【2】Type Switch 的基本用法
	type Switch 是 Go 语言中一种特殊的 switch 语句，它比较的是类型而不是具体的值。
	它判断某个接口变量的类型，然后根据具体类型再做相应处理。
*/

type User interface {
	sayHello()
}

type Chinese struct {
	Name string
}

func (c Chinese) sayHello() {
	fmt.Println("hello, I am Chinese")
}

// 跳广场舞 guangchangwu
func (c Chinese) guangChangWu() {
	fmt.Println("跳广场舞")
}

type American struct {
	Name string
}
func (a American) sayHello() {
	fmt.Println("hello, I am American")
}
func (a American) disco() {
	fmt.Println("跳 disco")
}

// 定义一个函数：接收具备user接口的参数
// 这是一个多态方法 : 多态参数
func test(u User) {
	u.sayHello()
	// 断言 ：看u是否能转成Chinese类型并且赋值给c变量
	var c , bk = u.(Chinese)
	if bk {
		c.guangChangWu()
	}
}

// 
func test2(u User){
	u.sayHello()
	switch u.(type) {
		case Chinese:
			ch := u.(Chinese)
			ch.guangChangWu()
		case American:
			am := u.(American)
			am.disco()
		default:
			fmt.Println("default")
	}
}
func main() {
	var a American
	var b Chinese
	test(b)
	test(a)
	fmt.Println("--------------------------------------------------")
	test2(b)
	test2(a)
}